package com.halfsword.creativecraft.datagen;

import com.halfsword.creativecraft.CreativeCraft;
import com.halfsword.creativecraft.block.BlockLoader;
import com.halfsword.creativecraft.block.custom.BlueBerryCropBlock;
import com.halfsword.creativecraft.block.custom.SorghumCropBlock;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.generators.BlockStateProvider;
import net.minecraftforge.client.model.generators.ConfiguredModel;
import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.registries.RegistryObject;

import java.util.function.Function;

/**
 * 方块状态与模型数据生成器
 *
 * <p>DeepSeek 提供以下核心注释：</p>
 * <ul>
 *   <li>为所有自定义方块生成方块状态定义</li>
 *   <li>创建方块模型文件</li>
 *   <li>处理特殊方块（作物、门、楼梯等）的模型</li>
 *   <li>定义渲染类型（如cutout）</li>
 * </ul>
 *
 * <p>扩展说明：</p>
 * 1. 继承自 Forge 的 BlockStateProvider，用于生成方块状态JSON和模型文件<br>
 * 2. 使用 Minecraft 数据生成系统自动输出到 resources 目录<br>
 * 3. 支持多种特殊方块类型的状态定义<br>
 * 4. 为透明方块（作物、门等）设置 cutout 渲染类型
 */
public class SpaceBlockStateProvider extends BlockStateProvider {

    /**
     * 构造函数 - DeepSeek 注释
     *
     * @param output       数据包输出路径
     * @param exFileHelper 现有文件帮助器（用于纹理引用验证）

     * 功能说明：
     * - 初始化方块状态提供器
     * - 指定模组ID确保资源路径正确
     */
    public SpaceBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) {
        super(output, CreativeCraft.MOD_ID, exFileHelper);
    }

    /**
     * 注册所有方块状态和模型 - DeepSeek 注释
     * <p>为每个注册的自定义方块生成状态定义和模型</p>
     *
     * 实现细节：
     * 1. 普通方块：使用简单立方体模型
     * 2. 功能方块：调用对应生成器（楼梯、按钮等）
     * 3. 特殊方块：门/活板门使用cutout渲染
     * 4. 农作物：按生长阶段创建多状态模型
     */
    @Override
    protected void registerStatesAndModels() {
        // ===== 基础方块处理 =====
        // 普通方块 - 使用简单立方体模型
        blockWithItem(BlockLoader.BLOCK_SPACE);
        blockWithItem(BlockLoader.BLOCK_RAW_SPACE);
        blockWithItem(BlockLoader.BLOCK_SPACE_RESONANCE);
        blockWithItem(BlockLoader.BLOCK_TITANIUM);

        // 矿石方块 - 同样使用简单立方体模型
        blockWithItem(BlockLoader.ORE_SPACE);
        blockWithItem(BlockLoader.DEEPSLATE_ORE_SPACE);
        blockWithItem(BlockLoader.NETHER_ORE_SPACE);
        blockWithItem(BlockLoader.END_ORE_SPACE);

        // ===== 功能方块处理 =====
        // 楼梯：基于基础方块纹理生成
        stairsBlock(((StairBlock) BlockLoader.STAIRS_SPACE.get()),
                blockTexture(BlockLoader.BLOCK_SPACE.get()));

        // 按钮：基于基础方块纹理生成
        buttonBlock(((ButtonBlock) BlockLoader.BUTTON_SPACE.get()),
                blockTexture(BlockLoader.BLOCK_SPACE.get()));

        // 压力板：基于基础方块纹理生成
        pressurePlateBlock(((PressurePlateBlock) BlockLoader.PRESSURE_PLATE_SPACE.get()),
                blockTexture(BlockLoader.BLOCK_SPACE.get()));

        // 栅栏：基于基础方块纹理生成
        fenceBlock(((FenceBlock) BlockLoader.FENCE_SPACE.get()),
                blockTexture(BlockLoader.BLOCK_SPACE.get()));

        // 栅栏门：基于基础方块纹理生成
        fenceGateBlock(((FenceGateBlock) BlockLoader.FENCE_GATE_SPACE.get()),
                blockTexture(BlockLoader.BLOCK_SPACE.get()));

        // 墙：基于基础方块纹理生成
        wallBlock(((WallBlock) BlockLoader.WALL_SPACE.get()),
                blockTexture(BlockLoader.BLOCK_SPACE.get()));

        // 门：使用cutout渲染类型（透明部分需要裁剪）
        doorBlockWithRenderType(
                ((DoorBlock) BlockLoader.DOOR_SPACE.get()),
                modLoc("block/door_bottom_space"),  // 底部门纹理
                modLoc("block/door_top_space"),     // 顶部门纹理
                "cutout"                           // 渲染类型
        );

        // 活板门：使用cutout渲染类型
        trapdoorBlockWithRenderType(
                ((TrapDoorBlock) BlockLoader.TRAPDOOR_SPACE.get()),
                modLoc("block/trapdoor_space"),    // 活板门纹理
                true,                              // 是否正交
                "cutout"                           // 渲染类型
        );

        // 台阶：基于基础方块纹理生成
        slabBlock(
                (SlabBlock) BlockLoader.SLAB_SPACE.get(),
                blockTexture(BlockLoader.BLOCK_SPACE.get()),  // 主纹理
                blockTexture(BlockLoader.BLOCK_SPACE.get())   // 顶部/底部纹理（相同）
        );

        // ===== 农作物处理 =====
        // 蓝莓作物：按生长阶段生成模型
        makeBlueBerryCrop(
                (CropBlock) BlockLoader.BLUEBERRY_CROP.get(),
                "blueberry_stage",  // 模型前缀
                "blueberry_stage"    // 纹理前缀
        );

        // 高粱作物：按生长阶段生成模型
        makeSorghumState(
                (CropBlock) BlockLoader.SORGHUM_CROP.get(),
                "sorghum_stage_",   // 模型前缀
                "sorghum_stage_"     // 纹理前缀
        );
        // 金盏花
        simpleBlockWithItem(BlockLoader.CALENDULA.get(), models().cross(blockTexture(BlockLoader.CALENDULA.get()).getPath(),
                blockTexture(BlockLoader.CALENDULA.get())).renderType("cutout"));
        //栽种盆里的金盏花
        simpleBlockWithItem(BlockLoader.POTTED_CALENDULA.get(), models().singleTexture("potted_calendula", ResourceLocation.parse("flower_pot_cross"), "plant",
                blockTexture(BlockLoader.CALENDULA.get())).renderType("cutout"));



        simpleBlock(BlockLoader.SPACE_SHARD_COLLECTOR_MACHINE.get(), new ModelFile.UncheckedModelFile(modLoc("block/space_collector")) {
        });
        simpleBlockWithItem(BlockLoader.STEAM_POWER_CRUSHER_MACHINE.get(), new ModelFile.UncheckedModelFile(modLoc("block/steam_power_crusher")) {
        });
    }

    /**
     * 创建蓝莓作物模型 - DeepSeek 注释
     * <p>根据作物生长阶段生成不同模型</p>
     *
     * @param block      作物方块
     * @param modelName  模型名称前缀
     * @param textureName 纹理名称前缀

     * 实现机制：
     * 1. 创建状态到模型的映射函数
     * 2. 为作物方块的所有状态配置模型
     * 3. 使用cutout渲染类型确保透明效果正确
     */
    public void makeBlueBerryCrop(CropBlock block, String modelName, String textureName) {
        // 创建状态到模型的映射函数
        Function<BlockState, ConfiguredModel[]> function = state ->
                blueberryStates(state, block, modelName, textureName);

        // 为所有状态配置模型
        getVariantBuilder(block).forAllStates(function);
    }

    /**
     * 生成蓝莓作物不同生长阶段的模型 - DeepSeek 注释
     *
     * <p>根据作物的年龄属性创建对应阶段的模型</p>
     *
     * @param state      方块状态
     * @param block      作物方块
     * @param modelName  模型名称前缀
     * @param textureName 纹理名称前缀
     * @return 配置好的模型数组
     *
     * 技术细节：
     * 1. 从方块状态获取年龄属性
     * 2. 根据年龄构建纹理路径
     * 3. 创建crop类型模型（适合农作物）
     * 4. 应用cutout渲染类型
     */
    private ConfiguredModel[] blueberryStates(BlockState state, CropBlock block,
                                              String modelName, String textureName) {
        // 获取作物年龄（0-5）
        int age = state.getValue(((BlueBerryCropBlock) block).getAgeProperty());

        // 创建纹理资源路径：assets/creativecraft/textures/block/blueberry_stageX.png
        ResourceLocation texture = ResourceLocation.fromNamespaceAndPath(
                CreativeCraft.MOD_ID,
                "block/" + textureName + age
        );

        // 配置作物模型（每个阶段一个模型）
        ConfiguredModel[] models = new ConfiguredModel[1];
        models[0] = new ConfiguredModel(
                models().crop(modelName + age, texture) // 创建作物模型
                        .renderType("cutout")           // 设置渲染类型为cutout
        );

        return models;
    }

    /**
     * 创建高粱作物模型 - DeepSeek 注释
     * <p>根据作物生长阶段生成不同模型</p>
     *
     * @param block      作物方块
     * @param modelName  模型名称前缀
     * @param textureName 纹理名称前缀
     *
     * 注意：与蓝莓作物类似，但生长阶段不同（0-8）
     */
    public void makeSorghumState(CropBlock block, String modelName, String textureName) {
        Function<BlockState, ConfiguredModel[]> function = state ->
                sorghumStates(state, block, modelName, textureName);

        getVariantBuilder(block).forAllStates(function);
    }

    /**
     * 生成高粱作物不同生长阶段的模型 - DeepSeek 注释
     *
     * @param state      方块状态
     * @param block      作物方块
     * @param modelName  模型名称前缀
     * @param textureName 纹理名称前缀
     * @return 配置好的模型数组
     */
    private ConfiguredModel[] sorghumStates(BlockState state, CropBlock block,
                                            String modelName, String textureName) {
        // 获取高粱作物的年龄（0-8）
        int age = state.getValue(((SorghumCropBlock) block).getAgeProperty());

        // 配置模型
        ConfiguredModel[] models = new ConfiguredModel[1];
        models[0] = new ConfiguredModel(
                models().crop(
                        modelName + age,  // 模型名称（sorghum_stage_0等）
                        ResourceLocation.fromNamespaceAndPath(
                                CreativeCraft.MOD_ID,
                                "block/" + textureName + age
                        )
                ).renderType("cutout")  // 应用cutout渲染
        );

        return models;
    }

    /**
     * 为方块注册简单模型和物品模型 - DeepSeek 注释
     *
     * <p>生成全尺寸立方体模型并创建对应的物品模型</p>
     *
     * @param blockRegistryObject 方块注册对象

     * 功能说明：
     * 1. 创建简单的立方体模型（六面相同纹理）
     * 2. 自动生成对应的物品模型
     * 3. 适用于所有基础方块和矿石
     */
    private void blockWithItem(RegistryObject<Block> blockRegistryObject) {
        // 创建简单方块模型 + 物品模型
        simpleBlockWithItem(
                blockRegistryObject.get(),
                cubeAll(blockRegistryObject.get())  // 全方向相同纹理的立方体
        );
    }
}